{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "972c2a54-c532-42b5-b05d-cd73448d78af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "print(torch.cuda.is_available())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b6f92e1f-765c-4bed-ad35-ebebad9701f8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'torch.nn.modules.module.Module'>\n",
      "a\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "class LeNet(nn.Module):\n",
    "    def __init__(self):\n",
    "        print(\"a\")\n",
    "print(nn.Module)\n",
    "lenet = LeNet()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8638949a-fc67-49fa-a404-1c12b06b4551",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "魔数:2051, 图片数量: 60000张, 图片大小: 28*28\n",
      "16\n",
      ">784B 16 784\n",
      "已解析 10000张\n",
      "7839232\n",
      "已解析 20000张\n",
      "15679232\n",
      "已解析 30000张\n",
      "23519232\n",
      "已解析 40000张\n",
      "31359232\n",
      "已解析 50000张\n",
      "39199232\n",
      "已解析 60000张\n",
      "47039232\n",
      "魔数:2049, 图片数量: 60000张\n",
      "已解析 10000张\n",
      "已解析 20000张\n",
      "已解析 30000张\n",
      "已解析 40000张\n",
      "已解析 50000张\n",
      "已解析 60000张\n",
      "5.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "done\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import struct\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 训练集文件\n",
    "train_images_idx3_ubyte_file = 'data/mnist/train-images.idx3-ubyte'\n",
    "# 训练集标签文件\n",
    "train_labels_idx1_ubyte_file = 'data/mnist/train-labels.idx1-ubyte'\n",
    "\n",
    "# 测试集文件\n",
    "test_images_idx3_ubyte_file = 'data/mnist/t10k-images.idx3-ubyte'\n",
    "# 测试集标签文件\n",
    "test_labels_idx1_ubyte_file = 'data/mnist/t10k-labels.idx1-ubyte'\n",
    "\n",
    "\n",
    "def decode_idx3_ubyte(idx3_ubyte_file):\n",
    "    \"\"\"\n",
    "    解析idx3文件的通用函数\n",
    "    :param idx3_ubyte_file: idx3文件路径\n",
    "    :return: 数据集\n",
    "    \"\"\"\n",
    "    # 读取二进制数据\n",
    "    bin_data = open(idx3_ubyte_file, 'rb').read()\n",
    "\n",
    "    # 解析文件头信息，依次为魔数、图片数量、每张图片高、每张图片宽\n",
    "    offset = 0\n",
    "    fmt_header = '>iiii' #因为数据结构中前4行的数据类型都是32位整型，所以采用i格式，但我们需要读取前4行数据，所以需要4个i。我们后面会看到标签集中，只使用2个ii。\n",
    "    magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, bin_data, offset)\n",
    "    print('魔数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols))\n",
    "\n",
    "    # 解析数据集\n",
    "    image_size = num_rows * num_cols\n",
    "    offset += struct.calcsize(fmt_header)  #获得数据在缓存中的指针位置，从前面介绍的数据结构可以看出，读取了前4行之后，指针位置（即偏移位置offset）指向0016。\n",
    "    print(offset)\n",
    "    fmt_image = '>' + str(image_size) + 'B'  #图像数据像素值的类型为unsigned char型，对应的format格式为B。这里还有加上图像大小784，是为了读取784个B格式数据，如果没有则只会读取一个值（即一副图像中的一个像素值）\n",
    "    print(fmt_image,offset,struct.calcsize(fmt_image))\n",
    "    images = np.empty((num_images, num_rows, num_cols))\n",
    "    #plt.figure()\n",
    "    for i in range(num_images):\n",
    "        if (i + 1) % 10000 == 0:\n",
    "            print('已解析 %d' % (i + 1) + '张')\n",
    "            print(offset)\n",
    "        images[i] = np.array(struct.unpack_from(fmt_image, bin_data, offset)).reshape((num_rows, num_cols))\n",
    "        #print(images[i])\n",
    "        offset += struct.calcsize(fmt_image)\n",
    "#        plt.imshow(images[i],'gray')\n",
    "#        plt.pause(0.00001)\n",
    "#        plt.show()\n",
    "    #plt.show()\n",
    "\n",
    "    return images\n",
    "\n",
    "\n",
    "def decode_idx1_ubyte(idx1_ubyte_file):\n",
    "    \"\"\"\n",
    "    解析idx1文件的通用函数\n",
    "    :param idx1_ubyte_file: idx1文件路径\n",
    "    :return: 数据集\n",
    "    \"\"\"\n",
    "    # 读取二进制数据\n",
    "    bin_data = open(idx1_ubyte_file, 'rb').read()\n",
    "\n",
    "    # 解析文件头信息，依次为魔数和标签数\n",
    "    offset = 0\n",
    "    fmt_header = '>ii'\n",
    "    magic_number, num_images = struct.unpack_from(fmt_header, bin_data, offset)\n",
    "    print('魔数:%d, 图片数量: %d张' % (magic_number, num_images))\n",
    "\n",
    "    # 解析数据集\n",
    "    offset += struct.calcsize(fmt_header)\n",
    "    fmt_image = '>B'\n",
    "    labels = np.empty(num_images)\n",
    "    for i in range(num_images):\n",
    "        if (i + 1) % 10000 == 0:\n",
    "            print ('已解析 %d' % (i + 1) + '张')\n",
    "        labels[i] = struct.unpack_from(fmt_image, bin_data, offset)[0]\n",
    "        offset += struct.calcsize(fmt_image)\n",
    "    return labels\n",
    "\n",
    "\n",
    "def load_train_images(idx_ubyte_file=train_images_idx3_ubyte_file):\n",
    "    \"\"\"\n",
    "    TRAINING SET IMAGE FILE (train-images-idx3-ubyte):\n",
    "    [offset] [type]          [value]          [description]\n",
    "    0000     32 bit integer  0x00000803(2051) magic number\n",
    "    0004     32 bit integer  60000            number of images\n",
    "    0008     32 bit integer  28               number of rows\n",
    "    0012     32 bit integer  28               number of columns\n",
    "    0016     unsigned byte   ??               pixel\n",
    "    0017     unsigned byte   ??               pixel\n",
    "    ........\n",
    "    xxxx     unsigned byte   ??               pixel\n",
    "    Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).\n",
    "\n",
    "    :param idx_ubyte_file: idx文件路径\n",
    "    :return: n*row*col维np.array对象，n为图片数量\n",
    "    \"\"\"\n",
    "    return decode_idx3_ubyte(idx_ubyte_file)\n",
    "\n",
    "\n",
    "def load_train_labels(idx_ubyte_file=train_labels_idx1_ubyte_file):\n",
    "    \"\"\"\n",
    "    TRAINING SET LABEL FILE (train-labels-idx1-ubyte):\n",
    "    [offset] [type]          [value]          [description]\n",
    "    0000     32 bit integer  0x00000801(2049) magic number (MSB first)\n",
    "    0004     32 bit integer  60000            number of items\n",
    "    0008     unsigned byte   ??               label\n",
    "    0009     unsigned byte   ??               label\n",
    "    ........\n",
    "    xxxx     unsigned byte   ??               label\n",
    "    The labels values are 0 to 9.\n",
    "\n",
    "    :param idx_ubyte_file: idx文件路径\n",
    "    :return: n*1维np.array对象，n为图片数量\n",
    "    \"\"\"\n",
    "    return decode_idx1_ubyte(idx_ubyte_file)\n",
    "\n",
    "\n",
    "def load_test_images(idx_ubyte_file=test_images_idx3_ubyte_file):\n",
    "    \"\"\"\n",
    "    TEST SET IMAGE FILE (t10k-images-idx3-ubyte):\n",
    "    [offset] [type]          [value]          [description]\n",
    "    0000     32 bit integer  0x00000803(2051) magic number\n",
    "    0004     32 bit integer  10000            number of images\n",
    "    0008     32 bit integer  28               number of rows\n",
    "    0012     32 bit integer  28               number of columns\n",
    "    0016     unsigned byte   ??               pixel\n",
    "    0017     unsigned byte   ??               pixel\n",
    "    ........\n",
    "    xxxx     unsigned byte   ??               pixel\n",
    "    Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).\n",
    "\n",
    "    :param idx_ubyte_file: idx文件路径\n",
    "    :return: n*row*col维np.array对象，n为图片数量\n",
    "    \"\"\"\n",
    "    return decode_idx3_ubyte(idx_ubyte_file)\n",
    "\n",
    "\n",
    "def load_test_labels(idx_ubyte_file=test_labels_idx1_ubyte_file):\n",
    "    \"\"\"\n",
    "    TEST SET LABEL FILE (t10k-labels-idx1-ubyte):\n",
    "    [offset] [type]          [value]          [description]\n",
    "    0000     32 bit integer  0x00000801(2049) magic number (MSB first)\n",
    "    0004     32 bit integer  10000            number of items\n",
    "    0008     unsigned byte   ??               label\n",
    "    0009     unsigned byte   ??               label\n",
    "    ........\n",
    "    xxxx     unsigned byte   ??               label\n",
    "    The labels values are 0 to 9.\n",
    "\n",
    "    :param idx_ubyte_file: idx文件路径\n",
    "    :return: n*1维np.array对象，n为图片数量\n",
    "    \"\"\"\n",
    "    return decode_idx1_ubyte(idx_ubyte_file)\n",
    "\n",
    "\n",
    "train_images = load_train_images()\n",
    "\n",
    "train_labels = load_train_labels()\n",
    "# test_images = load_test_images()\n",
    "# test_labels = load_test_labels()\n",
    "\n",
    "# 查看前十个数据及其标签以读取是否正确\n",
    "for i in range(10):\n",
    "    print(train_labels[i])\n",
    "    plt.imshow(train_images[i], cmap='gray')\n",
    "    plt.pause(0.000001)\n",
    "    plt.show()\n",
    "print('done')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
